package id

import (
	"crypto/rand"
	"fmt"
	"github.com/google/uuid"
)

// GenerateUUIDv8WithTable 生成带分表基因的UUID v8（分表ID存放在最后一个字节，支持0-255个分表）
func GenerateUUIDv8WithTable(tableID int) (uuid.UUID, error) {
	// 支持0-255个分表，若需限制更小范围（如0-15）可改为 tableID < 0 || tableID > 15
	if tableID < 0 || tableID > 255 {
		return uuid.Nil, fmt.Errorf("tableID must be 0-255")
	}
	var u uuid.UUID

	// 1. 填充前15字节为随机数（最后一字节留作分表基因）
	if _, err := rand.Read(u[:15]); err != nil {
		return uuid.Nil, err
	}

	// 2. 最后一个字节（索引15）存储分表基因
	u[15] = byte(tableID)

	// 3. 设置UUID v8版本位和变体位（保持格式规范）
	u[6] = (u[6] & 0x0F) | 0x80 // 版本位：第6字节前4位为1000（v8）
	u[8] = (u[8] & 0x3F) | 0x80 // 变体位：第8字节前2位为10

	return u, nil
}
